import format from "./format"

export default class Time extends Date {

  constructor(...d) {
    super(...d)

    this.format = format
    this.useUTC = false
  }

  set UTC(isUse = false) {
    this.useUTC = !!isUse
  }

  get UTC() {
    return this.useUTC
  }

  /**
   * 获取实际月份 会在标准库的基础上加1
   * @returns {Number} 1-12
   */
  getMonth() {
    return super.getMonth() + 1
  }

  /**
   * 获取UTC时区实际月份 会在标准库的基础上加1
   * @returns {Number} 1-12
   */
  getUTCMonth() {
    return super.getUTCMonth() + 1
  }

  /**
   *  重写返回的日期格式，更适合中国业务需要
   * @returns {String} eg. 2022-01-01 12:00:00
   */
  toDateString() {
    return this.format()
  }

  /**
   * 返回当前时间的格林威治时间时间戳秒数，不同于 getTime 方法
   * @returns {Number}
   */
  timestamp() {
    return parseInt(String(this.getTime()).slice(0, -3))
  }

  /**
   * 是否是闰年
   * @returns {Boolean} true/false
   */
  isLeapYear() {
    const year = this.UTC ? this.getUTCFullYear() : this.getFullYear()
    return year % 400 === 0 || (year % 4 === 0 && year % 100 > 0)
  }

  /**
   * 增加年份
   * @param {Number} n 需要增加的年份，支持正负数，负数表示减少年份
   * @returns {this} 增加了年份后的Time实例
   */
  addYear(n) {
    const y = parseInt(this.format('Y')) + parseInt(n)
    this.UTC ? this.setUTCFullYear(y) : this.setFullYear(y)
    return this
  }

  /**
   * 增加月份
   * @param {Number} n 需要增加的月份，支持正负数，负数表示减少月份
   * @returns {this}
   */
  addMonth(n) {
    const m = parseInt(this.format('n')) + parseInt(n)
    this.UTC ? this.setUTCMonth(m - 1) : this.setMonth(m - 1)
    return this
  }

  /**
   * 增加天数
   * @param {Number} n 需要增加的天数，支持正负数，负数表示减少天数
   * @returns {this}
   */
  addDays(n) {
    const d = parseInt(this.format('j')) + parseInt(n)
    this.UTC ? this.setUTCDate(d) : this.setDate(d)
    return this
  }

  /**
   * 增加小时数
   * @param {Number} n
   * @returns {this}
   */
  addHours(n) {
    const h = parseInt(this.format('G')) + parseInt(n)
    this.UTC ? this.setUTCHours(h) : this.setHours(h)
    return this
  }

  /**
   * 增加分钟数
   * @param {Number} n
   * @returns {this}
   */
  addMinutes(n) {
    const m = (this.UTC ? this.getUTCMinutes() : this.getMinutes()) + parseInt(n)
    this.UTC ? this.setUTCMinutes(m) : this.setMinutes(m)
    return this
  }

  /**
   * 增加秒数
   * @param {Number} n
   * @returns {this}
   */
  addSeconds(n) {
    const s = (this.UTC ? this.getUTCSeconds() : this.getSeconds()) + parseInt(n)
    this.UTC ? this.setUTCSeconds(s) : this.setSeconds(s)
    return this
  }
}

